package com.cal.utms.core;

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;

import com.cal.utms.dao.user_maintenance.UserDaoImpl;
import com.cal.utms.entity.Menu;
import com.cal.utms.entity.MenuItem;
import com.cal.utms.entity.UserGroup;
import com.cal.utms.entity.UserGroupScreen;

public class MenuModel {

	protected MenuItemDao menuItemDao = new MenuItemDao();
	UserDaoImpl daoImpl = new UserDaoImpl();

	public List<MenuDto> getAllMenuItems() {

		List<MenuItem> items = menuItemDao.getAllMenuItem();
		List<MenuDto> menuDtos = new ArrayList<MenuDto>();
		for (MenuItem menuItem : items) {
			if (menuItem.getMenuItem() == null) {
				MenuDto itemDto = createMenuItemModel(menuItem);
				if (menuItem.getMenuItems().size() > 0)
					itemDto.setResult(getChildItem(menuItem));
				menuDtos.add(itemDto);
			}
		}
		return menuDtos;
	}

	private List<MenuDto> getChildItem(MenuItem menuItem) {
		List<MenuDto> childran = new ArrayList<MenuDto>();
		for (MenuItem childitem : menuItem.getMenuItems()) {
			MenuDto child = createMenuItemModel(childitem);
			if (childitem.getMenuItems().size() > 0)
				child.setResult(getChildItem(childitem));
			childran.add(child);
		}
		return childran;
	}

	private MenuDto createMenuItemModel(MenuItem item) {
		MenuDto itemDto = new MenuDto();
		itemDto.setId(item.getId());
		itemDto.setText(item.getName());
		itemDto.setExpanded(true);
		if (item.getScreen() != null) {
			itemDto.setScreenId(item.getScreen().getId());
			if (item.getScreen().getPermission().getView())
				itemDto.setView(false);
			else
				itemDto.setView(null);

			if (item.getScreen().getPermission().getCreate())
				itemDto.setCreate(false);
			else
				itemDto.setCreate(null);

			if (item.getScreen().getPermission().getConfirm())
				itemDto.setConfirm(false);
			else
				itemDto.setConfirm(null);

			if (item.getScreen().getPermission().getReject())
				itemDto.setReject(false);
			else
				itemDto.setReject(null);
		}
		if (item.getAction() != null) {
			itemDto.setLeaf(true);
			itemDto.setParentId(item.getMenuItem().getId());
			itemDto.setChecked(false);
		} else {
			itemDto.setLeaf(false);
		}
		return itemDto;
	}

	public List<MenuItemDto> getMainMenu() {
		Menu menu = menuItemDao.getMenuByName("MAIN");

		List<MenuItemDto> menuItemDtos = new ArrayList<MenuItemDto>();
		for (MenuItem menuItem : menu.getMenuItems()) {
			if (menuItem.getMenuItem() == null) {
				MenuItemDto itemDto = createMenuItemDto(menuItem);
				if (menuItem.getMenuItems().size() > 0)
					itemDto.setChildMenuItems(getChildran(menuItem));
				menuItemDtos.add(itemDto);
			}
		}
		return menuItemDtos;
	}

	private List<MenuItemDto> getChildran(MenuItem menuItem) {
		List<MenuItemDto> childran = new ArrayList<MenuItemDto>();
		for (MenuItem childitem : menuItem.getMenuItems()) {
			MenuItemDto child = createMenuItemDto(childitem);
			if (childitem.getMenuItems().size() > 0)
				child.setChildMenuItems(getChildran(childitem));
			else
				child.setScreenId(childitem.getScreen().getId());
			childran.add(child);
		}
		return childran;
	}

	public MenuItemDto createMenuItemDto(MenuItem item) {
		MenuItemDto itemDto = new MenuItemDto();
		itemDto.setId(item.getId());
		itemDto.setName(item.getName());
		itemDto.setOrder(item.getOrder());
		itemDto.setStatus(item.getStatus());
		if (item.getMenuItem() != null)
			itemDto.setPerantid(item.getMenuItem().getId());
		itemDto.setAction(item.getAction());
		return itemDto;
	}

	public List<MenuItemDto> getScreenByGroupId1(int groupid) {
		List<MenuItem> menuItems = menuItemDao.getScreenByGroupId(groupid);
		List<MenuItem> perantmenuItems = new ArrayList<MenuItem>();
		List<MenuItemDto> menuItemDtos = new ArrayList<MenuItemDto>();

		for (MenuItem menuItem : menuItems) {
			if (menuItem.getMenuItem() != null) {
				if (!perantmenuItems.contains(menuItem.getMenuItem()))
					perantmenuItems.add(menuItem.getMenuItem());
			}
		}
		List<MenuItem> allmenuItems = new ArrayList<MenuItem>();
		allmenuItems.addAll(perantmenuItems);
		allmenuItems.addAll(menuItems);
		for (MenuItem menuItem : allmenuItems) {
			if (menuItem.getMenuItem() == null) {
				MenuItemDto itemDto = createMenuItemDto(menuItem);
				if (menuItem.getMenuItems().size() > 0)
					itemDto.setChildMenuItems(getChildran(menuItem));
				menuItemDtos.add(itemDto);
			}
		}
		return menuItemDtos;
	}

	public List<MenuItemDto> getScreenByGroupId(int groupid) {

		MenuItemDao dao = new MenuItemDao();
		List<MenuItem> menuItems = dao.getScreenByGroupId(groupid);
		LinkedHashMap<Integer, MenuItem> menumap = new LinkedHashMap<Integer, MenuItem>();
		LinkedHashMap<Integer, MenuItem> submenumap = new LinkedHashMap<Integer, MenuItem>();
		for (MenuItem menuItem : menuItems) {
			if (menuItem.getMenuItem() != null) {
				MenuItem perentMenu = menuItem.getMenuItem();
				if (perentMenu.getMenuItem() == null) {
					if (menumap.containsKey(perentMenu.getId())) {
						menumap.get(perentMenu.getId()).getMenuItems().add(menuItem);
					} else {
						perentMenu.setMenuItems(new ArrayList<MenuItem>());
						perentMenu.getMenuItems().add(menuItem);
						menumap.put(perentMenu.getId(), perentMenu);
					}
				} else {
					MenuItem superMenu = perentMenu.getMenuItem();
					if (!menumap.containsKey(superMenu.getId())) {
						perentMenu.setMenuItems(new ArrayList<MenuItem>());
						perentMenu.getMenuItems().add(menuItem);
						submenumap.put(perentMenu.getId(), perentMenu);

						superMenu.setMenuItems(new ArrayList<MenuItem>());
						superMenu.getMenuItems().add(submenumap.get(perentMenu.getId()));
						menumap.put(superMenu.getId(), superMenu);
					} else {
						if (submenumap.containsKey(perentMenu.getId())) {
							submenumap.get(perentMenu.getId()).getMenuItems().add(menuItem);
						} else {
							perentMenu.setMenuItems(new ArrayList<MenuItem>());
							perentMenu.getMenuItems().add(menuItem);
							submenumap.put(perentMenu.getId(), perentMenu);

							menumap.get(superMenu.getId()).getMenuItems().add(perentMenu);
						}
					}
				}
			}
		}
		List<MenuItem> allmenuItems = new ArrayList<MenuItem>(menumap.values());
		List<MenuItemDto> menuItemDtos = new ArrayList<MenuItemDto>();
		for (MenuItem menuItem : allmenuItems) {
			if (menuItem.getMenuItem() == null) {
				MenuItemDto itemDto = createMenuItemDto(menuItem);
				if (menuItem.getMenuItems().size() > 0)
					itemDto.setChildMenuItems(getChildran(menuItem));
				menuItemDtos.add(itemDto);
			}
		}
		return menuItemDtos;

	}

	public List<Integer> getMenuIdByGroupId(int groupid) {
		MenuItemDao dao = new MenuItemDao();
		List<MenuItem> menuItems = dao.getScreenByGroupId(groupid);
		List<Integer> menuIds = new ArrayList<Integer>();
		for (MenuItem menuItem : menuItems) {
			menuIds.add(menuItem.getId());
			if (menuItem.getMenuItem() != null) {
				menuIds.add(menuItem.getMenuItem().getId());
			} else {
				if (menuItem.getMenuItem().getMenuItem() != null) {
					menuIds.add(menuItem.getMenuItem().getMenuItem().getId());
				}
			}
		}
		return menuIds;
	}

	public void getScreenPermition(int screenid, UserGroup userGroup, ScreenDto dto) {

		UserGroupScreen groupScreen = daoImpl.getUserGroupScreenByGroup(screenid, userGroup.getId());

		if (groupScreen != null) {
			dto.setConfirm(groupScreen.getConfirm());
			dto.setView(groupScreen.getView());
			dto.setReject(groupScreen.getReject());
			dto.setCreate(groupScreen.getSubmit());
			dto.setScreenid(groupScreen.getId().getScreenId());
		}

	}

	public List<ScreenGroupDto> getScreenByGroup(int groupid) {
		List<UserGroupScreen> groupScreens = daoImpl.getScreenBygroup(groupid);
		List<ScreenGroupDto> dtos = new ArrayList<ScreenGroupDto>();
		if (groupScreens.size() > 0) {
			for (UserGroupScreen screen : groupScreens) {
				ScreenGroupDto dto = new ScreenGroupDto();
				dto.setConfirm(screen.getConfirm());
				dto.setMenuId(daoImpl.getMenuIdByScreenId(screen.getId().getScreenId()));
				dto.setReject(screen.getReject());
				dto.setScreenid(screen.getId().getScreenId());
				dto.setSubmit(screen.getSubmit());
				dto.setView(screen.getView());
				dtos.add(dto);
			}
		}
		return dtos;
	}
}
